#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void menu()
{
	printf("*********************************\n");
	printf("**********1:开始游戏*************\n");
	printf("*********************************\n");
	printf("**********0:退出游戏*************\n");
	printf("*********************************\n");
}

void game()
{
	//用来储存摆放的雷的信息
	char mine[ROWS][COLS] = { 0 };
	//用来储存查找出的雷的信息
	char show[ROWS][COLS] = { 0 };

	//初始化mine数组
	InitBoard(mine, ROWS, COLS, '0');
	//初始化show数组
	InitBoard(show, ROWS, COLS, '*');

	//打印show数组
	DisplayBoard(show, ROW, COL);

	//随机分配地雷
	SetMine(mine, ROW, COL);

	//正式开始排查雷
	FindMine(ROW, COL, show, mine);

}

void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set)
{
	for (int i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
 }

void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{
	for (int x = 0; x <= col; x++)//打印出第一行的0到9十个数字作为列号
	{
		printf("%d ", x);
	}
	printf("\n");//打印换行
	for (int i = 1; i <= row; i++)
	{
		int j = 1;
		printf("%d ", i);//在每一列开始前打印行号
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}

void SetMine(char arr[ROWS][COLS], int row, int col)
{
	int count = 10;
	while (count)//每一次布置雷，count便会减一，布置十次后count=0，while循环结束
	{
		int i = rand() % 10 + 1;
		int j = rand() % 10 + 1;

		if (arr[i][j] == '0')//为了防止在同一位置布置多次
		{
			arr[i][j] = '1';//布置地雷
			count--;
		}
	}
}


int  GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	int sum = 0;
	for (int i = x - 1; i <= x + 1; i++)
	{
		int j = 0;
		for (j = y - 1; j <= y + 1; j++)
		{
			sum += mine[i][j];//算出九个位置ASCII码值之和
		}
	}
	return sum - 9 * '0';//减去九个字符0的ASCII码值就等于周围雷数
}


void FindMine(int row, int col, char show[ROWS][COLS], char mine[ROWS][COLS])
{
	int x = 0;//代表玩家输入的横坐标
	int y = 0;//代表玩家输入的纵坐标
	int win = 0;//代表玩家的胜利指标，当win的值等于所有的空格子时，玩家胜利
	while (win < (ROW* COL - 10))//当玩家没有猜中雷的时候，游戏会一直进行，所以使用while循环
	{
		printf("请输入你要查验的坐标（x，y）\n");
		scanf("%d,%d", &x, &y);
		if (x >= 0 && x <= row && y >= 0 && y <= col)
		{
			if (mine[x][y] == '1')//'1'代表是地雷，当数组的值等于'1'的时候，说明中雷了
			{
				printf("不好意思，你被炸死了，游戏失败!\n");
				DisplayBoard(mine, ROW, COL);//游戏结束后给玩家展示所有的地雷
				break;//踩中雷了，break结束循环。
			}
			else
			{
				int num = GetMineCount(mine, x, y);//如果不是中雷，则用num等于周围雷数
				show[x][y] = num + '0';//由于是char类型数组，num是整形，一个整数加上字符0等于该整数的ASCII码值，打印出来则是该字符整数
				DisplayBoard(show, ROW, COL);//打印被展示的棋盘show
				win++;//每次猜对一个格子，win便会增加1
			}
		}
		else
		{
			printf("坐标非法，请重新输入:>\n");
		}
	}
}